package controller

import (
	"encoding/json"
	"errors"
	"fmt"
	"go-bluebell/model"
	"go-bluebell/service"

	"github.com/gin-gonic/gin"
)

func RegisterHandle(c *gin.Context) {
	var user model.RegisterUser

	// 参数获取 & 参数校验
	data, err := c.GetRawData() // 从c.Request.Body读取请求数据
	if err != nil {
		code := model.CodeInvalidParam
		model.ResponseFailed(c, code, code.Msg(), err)
		return
	}

	err = json.Unmarshal(data, &user) // 将json数据解析到结构体中（反序列化）
	if err != nil {
		code := model.CodeInvalidParam
		model.ResponseFailed(c, code, code.Msg(), err)
		return
	}

	// 业务处理（业务交给service层处理，controller 值进行异常记录和处理）
	err = service.Register(user)
	if err != nil {
		code := model.CodeServerBusy
		if errors.Is(err, model.ErrorUserExist) {
			code = model.CodeUserExist
		}
		model.ResponseFailed(c, code, code.Msg(), err)
		return
	}

	// 返回响应
	model.ResponseSuccess(c, nil)
}

func LoginHandle(c *gin.Context) {
	var loginUser model.LoginUser

	// 参数获取 & 参数校验
	data, err := c.GetRawData() // 从c.Request.Body读取请求数据
	if err != nil {
		code := model.CodeInvalidParam
		model.ResponseFailed(c, code, code.Msg(), err)
		return
	}

	err = json.Unmarshal(data, &loginUser) // 将json数据解析到结构体中（反序列化）
	if err != nil {
		code := model.CodeInvalidParam
		model.ResponseFailed(c, code, code.Msg(), err)
		return
	}

	// 业务处理（业务交给service层处理，controller 值进行异常记录和处理）
	user, token, err := service.Login(loginUser)
	if err != nil {
		code := model.CodeServerBusy
		if errors.Is(err, model.ErrorUserNotExist) {
			code = model.CodeUserNotExist
		}
		if errors.Is(err, model.ErrorInvalidPassword) {
			code = model.CodeInvalidPassword
		}
		model.ResponseFailed(c, code, code.Msg(), err)
		return
	}

	// 返回响应
	//model.ResponseSuccess(c, token)

	// 3.返回响应
	model.ResponseSuccess(c, gin.H{
		"user_id":       fmt.Sprintf("%d", user.UserID), // id值大于1<<53-1  int64类型的最大值是1<<63-1
		"user_name":     user.Username,
		"token":         token,
		"access_token":  token,
		"refresh_token": token,
	})

}
